package carte.terrain;

import java.awt.Color;
import java.util.ArrayList;

import carte.Cellule;
import carte.element.Lava;

public class Volcano extends Land {
	
	//lorsque la foret est dans une zone ou l'on peut la placer, voici son taux d'apparition
	public static final float ERUPTION_RATE = 0.01f;
	public static final int RECESSION_QUANTITY = 6;
	//quantite propulsee a chaque eruption, doit etre un multiple de RECESSION_QUANTITY
	public static final int ERUPTION_QUANTITY_INIT = RECESSION_QUANTITY*5;
	public static final float RECESSION_RATE = 0.1f;
	//la chance qu'il a de se reveiller a chaque fois
	public static final float AWAKENING_RATE = 0.001f;
	
	private int quantityEruption;
	private boolean isAwake;
	
	protected static Volcano _instance;
	
	private static Color textureAwake = new Color(0,0,0);
	private static Color textureAsleep = new Color(100,100,100);

	public Volcano() {
		super();
		texture = textureAwake;
		isAwake = true;
		quantityEruption = 0;
	}
	
	//evolution du Volcan
	//Le volcan a une certaine probabilite d'entrer en eruption et de creer de la lave en grande quantite...
	public void evolve(ArrayList<Cellule> oldEnv, ArrayList<Cellule> newEnv){
		//si le volcan n'est pas endormi
		if(isAwake){
			//si le volcan est deja en eruption
			if(quantityEruption != 0){
				//alors il y a une chance qu'il y ai une recession
				if(rand.nextFloat() < RECESSION_RATE){
					quantityEruption -= RECESSION_QUANTITY;
					if(quantityEruption <= 0){
						quantityEruption = 0;
						//apres son eruption le volcan meurt
						sleep();
					}
				}
				//puis eruption
				newEnv.get(0).addFluid(Lava.getTypeName(), quantityEruption);
			}
			//sinon il a une change d'entrer en eruption
			else if(rand.nextFloat() < ERUPTION_RATE){
				quantityEruption = ERUPTION_QUANTITY_INIT;
				newEnv.get(0).addFluid(Lava.getTypeName(), quantityEruption);
			}
		}
		//sinon il peut se reveiller
		else{
			if(rand.nextFloat() < AWAKENING_RATE){
				awake();
				//il passe directement en eruption
				quantityEruption = ERUPTION_QUANTITY_INIT;
				//mais il attend la prochaine phase pour emettre
			}
		}
	}
	
	//Le volcan s'endort s'il a fait une eruption
	private void sleep(){
		isAwake = false;
		//il change de couleur
		texture = textureAsleep;
	}
	
	//Il peut se reveiller
	private void awake(){
		isAwake = true;
		texture = textureAwake;
	}
}
